"""
1、强制抛出异常
raise语句支持强制出发指定的异常。
如：如果只想判断是否出发了异常，但并不打算处理该异常，则可以使用更简单的raise语句重新触发异常。
"""
try:
    raise NameError('HiThere')
except NameError:
    print('An exception flew by!')

"""
2、异常中的else语句
else表达的是如果没有异常要执行的代码
"""
try:
    print(1)
except Exception as result:
    print(result)
else:
    print('我是else，是没有异常的时候执行的代码')

"""
3、Finally语句
finally表示的是无论是否异常都要执行的代码，例如 关闭文件。一般都是做一些清理工作
"""
try:
    f = open('abc.txt', 'r')
except Exception as result:
    f = open('abc.txt', 'w')
else:
    print('没有异常，真开心')
finally:
    if f:
        f.close()

"""
4、自定义异常类
程序可以通过创建新的异常类命名自己的异常。
不论是以直接的还是间接的方式，异常都应从Exception类继承。
异常类可以被定义成做其他类所能做得任何事，但通常应当保持简单，它往往只提供一些属性，允许相应的异常处理程序提取有关错误的信息。

大多数异常命名都应“Error”结尾，类似标准异常的命名
"""


# 自定义异常类，继承EXception
class PasswordTooShortInputError(Exception):
    """
    自定义异常：密码太短了
    """

    def __init__(self, length, min_len):
        self.length = length
        self.min_len = min_len

    def __str__(self):
        """
        打印异常对象，就会打印str函数的返回值
        :return:
        """
        return f'你输入的密码长度是{self.length},密码不能少于{self.min_len}个字符'

def input_passworld():
    pwd=input('请输入您的密码：')
    # 规定密码的长度不能少于6个字符
    if len(pwd)<6:
        raise PasswordTooShortInputError(len(pwd),min_len=6)

if __name__ == '__main__':
    input_passworld()